require exports
✒️ 2025-05-26 14:19 내용 수정
require과 exports로 모듈 사용
- require와 exports는 Node.js에서 사용하는 CommonJS 키워드이며, Javascript의 import/export와 비슷한 기능을 하지만 문법 구조가 다르다.
module wrapper
- module 코드가 실행되기 전에 Node.js에선 코드를 function wrapper로 감싼다.
- 참고 자료 : Node.js The module scope
- 글로벌처럼 보이지만 실제론 모듈 스코프인 변수들을 제공한다.
(function(exports, require, module, __filename, __dirname) {
// module 코드
});
| 모듈 스코프 | 설명 |
|---|---|
| __dirname | 현재 module의 디렉터리 이름 |
| __filename | 현재 module의 이름 |
| exports | module.exports의 shortcut |
| module | 현재 module |
| require(id) | module, JSON, 로컬 파일을 가져올 때 사용 |
require
- 모듈, JSON, 로컬 파일을 가져올 때 사용한다.
- require()을 호출하면 항상 CommonJS 모듈 로더를 사용하고, import()를 호출하면 ECMAScript 모듈 로더를 호출한다.
exports
- module : 현재 module을 가리키는 객체를 참조하는 각 모듈 별 지역 변수다.
- module.exports : module 시스템에 의해 생성되는 객체로, 다른 곳으로 내보낼 객체를 module.exports에 할당한다.
- module.exports에 객체를 할당하면 모듈별 지역 변수인 exports에서 값이 재할당된다.
- 참고 자료 : Node.js module objects
- exports : 모듈의 파일 레벨 스코프에서 사용 가능한 변수이며, module이 평가(evaluate)되기 전에 module.exports의 값을 할당 받는다.
- modeul.exports의 shortcut으로 작동할 수 있지만, 다른 변수들처럼 exports에 새 값이 할당되면 module.exports에 더 이상 바인딩되지 않는다.
- 이런 특성 때문에 modeul.exports에 새 객체를 할당하면 exports에도 재할당해야 한다.
- 공식 문서에 이 부분에 대한 예제 코드와 설명이 있으니 참고.
- 참고 자료 : Node.js export shortcut, Chullin's require(), exports, module.exports 공식문서로 이해하기
module.exports.test = 'exports test'; // 해당 값이 required로부터 export됨
exports = {test : 'exports test'}; // 해당 모듈에서만 사용 가능하고 export 되지 않음(module.exports 바인딩 x)
// module.exports에 새 객체 할당 시 exports에도 같이 재할당하기
module.exports = exports = 'new test';
1. 상수와 변수 내보내고 사용하기
- exports : module.js 파일에서 상수와 변수를 만들고 내보낸다.
- module_test.js 이름의 파일을 생성하고 작성
// 상수
const PI = 3.14;
// 변수
let namePI = '원주율';
- exports 방법 1 : module.exports의 property로 추가
// exports - 1번 방법
module.exports = {
PI : PI,
namePI : namePI
}
// 위 표기를 더 간단하게 작성
module.exports = {
PI, namePI
}
- exports 방법 2 : exports의 property로 추가
- 이미 module.exports의 속성에 값을 할당하고 exports에 재할당 하게 되면 재할당된 값은 외부로 내보내지지 않기 때문에 주의
// exports - 2번 방법
exports.PI = PI;
exports.namePI = namePI;
- exports 방법 3 : 표현식으로 사용
// exports - 3번 방법
exports.PI = 3.14;
exports.namePI = '원주율';
- require : module_test.js 파일에서 module 파일을 가져와서 사용한다.
// 모듈 가져와서 사용하기
let calc = require('./module_test'); // ./module_test.js 확장자 생략 가능
console.log(calc.PI);
console.log(calc.namePI);
-0--
2. 함수 내보내고 사용하기
- 함수를 작성할 때 선언이나 표현식으로 작성한다.
- exports로 내보내기
- module_test.js 이름의 파일을 생성하고 작성
- export 방법은 export와 module.export의 재할당으로 인한 언바운드를 고려해서 선택한다.
// 함수
function plus(a, b) {
return (a + b);
}
function minus(a, b) {
return (a - b);
}
function multiple(a, b) {
return (a * b);
}
function divide(a, b) {
return (a / b);
}
// exports ---------------------------
// exports 1번 방법
module.exports = {
plus, minus, multiple, divide
}
// exports 2번 방법
exports.plus = plus;
exports.minus = minus;
exports.multiple = multiple;
exports.divide = divide;
- require로 가져오기 : module_test.js 파일에서 module 파일을 가져와서 사용한다.
let calc = require('./module_test'); // module_test.js
console.log(calc.plus(10, 20));
console.log(calc.minus(30, 24));
console.log(calc.multiple(5, 7));
console.log(calc.divide(8, 3));
3. 객체 내보내고 사용하기
- 내보낼 데이터가 많을 때 한 객체에 묶어서 내보내면 사용하기 편리하다.
- exports로 내보내기
- module_test.js 이름의 파일을 생성하고 작성
- export 방법은 export와 module.export의 재할당으로 인한 언바운드를 고려해서 선택한다.
let test = {
date : '2024-02-02',
type : ['test', 'test2'],
printTypes() {
for(let i of this.type) {
console.log(i);
}
}
}
// exports ---------------------------
// exports 1번 방법
module.exports = test;
// exports 2번 방법
exports.test = test;
- require로 가져오기 : module_test.js 파일에서 module 파일을 가져와서 사용한다.
let calc = require('./module_test'); // module_test.js
console.log(calc.PI);
console.log(calc.academy);
console.log(calc.test);
calc.test.printTypes();
- 위에서 작성한 plus, minus, multiple, divide 함수를 calc라는 객체로 묶어서 한 번에 내보낼 수 있다.
let calc = {
plus : (a, b) => a + b,
minus : (a, b) => a - b,
multiple : (a, b) => a * b,
divide : (a, b) => a / b
}
module.exports = calc;
// exports 3번 방식과 함수 표현식으로 작성하면
// 아래처럼도 가능하다.
exports.calc = {
plus : (a, b) => a + b,
minus : (a, b) => a - b,
multiple : (a, b) => a * b,
divide : (a, b) => a / b
}
- module_test.js 파일에서 module 파일 가져와서 출력
let math = require('./module_test'); // module_test.js
console.log(math.calc.plus(1,1));
console.log(math.calc.minus(10, 6));
console.log(math.calc.multiple(2, 7));
console.log(math.calc.divide(9, 4));